今天來釐清 @material-ui/core/styles 的 API。
一個返回類名生成器函數的函數。
options (Object [optional]):
class name generator: 提供給 JSS。
import React from 'react';
import { StylesProvider, createGenerateClassName } from '@material-ui/core/styles';
const generateClassName = createGenerateClassName({
  productionPrefix: 'c',
});
export default function App() {
  return (
    <StylesProvider generateClassName={generateClassName}>...</StylesProvider>
  );
}
這個函數在運行時並沒有真正“做任何事情”,它只是身份函數,唯一目的是在為主題的函數 makeStyles/withStyles 提供樣式規則時阻止 TypeScript 的類型擴展。
styles: 樣式Object.
import { makeStyles, createStyles } from '@material-ui/core/styles';
const useStyles = makeStyles((theme: Theme) => createStyles({
  root: {
    backgroundColor: theme.color.red,
  },
}));
export default function MyComponent {
  const classes = useStyles();
  return <div className={classes.root} />;
}
這就是我們之前範例常常使用的 hook。
hook: 可以在functional component 中使用。
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
const useStyles = makeStyles({
  root: {
    backgroundColor: 'red',
    color: props => props.color,
  },
});
export default function MyComponent(props) {
  const classes = useStyles(props);
  return <div className={classes.root} />;
}
這是一個處理服務器端渲染的類助手,實用範例。
import ReactDOMServer from 'react-dom/server';
import { ServerStyleSheets } from '@material-ui/core/styles';
const sheets = new ServerStyleSheets();
const html = ReactDOMServer.renderToString(sheets.collect(<App />));
const cssString = sheets.toString();
const response = `
<!DOCTYPE html>
<html>
  <head>
    <style id="jss-server-side">${cssString}</style>
  </head>
  <body>${html}</body>
</html>
`;
使用樣式組件模式將樣式表與功能組件鏈接起來。
Component: 建立一個新的 component。
import React from 'react';
import { styled } from '@material-ui/core/styles';
const MyComponent = styled('div')({
  backgroundColor: 'red',
});
const MyThemeComponent = styled('div')(({
  theme
}) => ({
  padding: theme.spacing(1),
}));
export default function StyledComponents() {
  return (
    <MyThemeComponent>
      <MyComponent />
    </MyThemeComponent>
  );
}
那麼今天的內容就到這邊,明天還會接續講解後面的 API。